<?php

abstract class Controller
{
	
	/**
	* Notre modèle
	*/
	protected $mdl ;
	
	/**
	* Notre base de données
	*/
	protected $db ;
	
	/**
	* Notre vue
	*/
	protected $view ;
	
	/**
	* La session
	*/
	protected $session ;
	
	/**
	* Les paramètres POST et GET
	*/
	protected $params ;
	
	/**
	* Un tableau qui contiendra ce qu'on enverra à la vue.
	* La vue ne disposera que de ces données et aucune autre
	*/
	protected $data ;
	
	/**
	* Un tableau qui contiendra les filtes before et after
	*/
	protected $filter ;
	
	/**
	* Constructeur
	*/
	public function __construct ( )
	{
		
		$this->session = new PHPSession ( ) ;
		$this->session->start ( ) ;
		
	}
	
	/**
	* Envoie des params
	*/
	public function setParams ( $params )
	{
		$this->params = $params ;
	}
	
	/**
	* Méthode qui lance le traitement d'une action
	*/
	public function runAction ( $action )
	{
		
		// Les filtres befores
		if ( isset ( $this->filter['before'] ) && is_array ( $this->filter['before'] ) )
		{
			foreach ( $this->filter['before'] as $key => $value )
			{
				if ( $value === 'ALL' || in_array ( $action, $value ) )
				{
					if ( ! method_exists ( $this, $key ) )
					{
						throw new Exception ( 'Filtre before ' . $key . ' inextistant' ) ;
					}
					else
					{
						$this->$key ( ) ;
					}
				}
			}
		}
		
		// Notre action principale
		if ( ! method_exists ( $this, $action ) )
		{
			throw new Exception ( 'Action ' . $action . ' introuvable' ) ;
		}
		$this->$action ( ) ;
		
		// Nos filtres after
		if ( isset ( $this->filter['after'] ) && is_array ( $this->filter['after'] ) )
		{
			foreach ( $this->filter['after'] as $key => $value )
			{
				if ( in_array ( $action, $value ) )
				{
					if ( ! method_exists ( $this, $key ) )
					{
						throw new Exception ( 'Filtre after ' . $key . ' inextistant' ) ;
					}
					else
					{
						$this->$key ( ) ;
					}
				}
			}
		}
	}
	
	/**
	* Méthode privée appelée par chaque action et qui se chargera de la vue.
	*/
	public function render ( $view, $template = null, $layout = null )
	{
		
		$this->view = new $view ;
		$this->view->render ( $this->data, $this->params, $template, $layout ) ;
		
	}
	
	/**
	* Setter et getter
	*/
	public function __set ( $key, $value )
	{
		$this->data[$key] = $value ;
	}
	
	public function __get ( $key )
	{
		if ( isset ( $this->data[$key] ) )
		{
			return $this->data[$key] ;
		}
		return null ;
	}
	
	/**
	* Isset et unset
	*/
	public function __isset ( $key )
	{
		return isset ( $this->data[$key] ) ;
	}
	
	public function __unset ( $key )
	{
		unset ( $this->data[$key] ) ;
		return null ;
	}
	
}

?>